perm filename DOVSER.MID[NET,MRC] blob sn#544800 filedate 1980-10-29 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	X FCS FULTWX ECHOFF TERMID CORBEG TERSTR PDL COREND
C00004 00003	DOVSER CPYHST 1DIGTP NOTTIP
C00006 00004	GETCMD
C00007 00005	GETCM1 BROKET BROKT1 BROKT2 LINE1 LINE2 LINE3 GETCM3
C00009 00006	ETCRLF GETPTY GETPT1 SUICID ...LIT SVRRTS ERRTNS ERRHAN ERRINS HSTTAB HSTSIX
C00011 ENDMK
C⊗;
;X FCS FULTWX ECHOFF TERMID CORBEG TERSTR PDL COREND

TITLE DOVSER
SUBTTL Definitions

; Mark Crispin, SU-AI, October 1980

; Assembly switches

IFNDEF SVRSKT,SVRSKT==105		; default listen socket
IFNDEF PDLLEN,PDLLEN==50		; stack length

; AC definitions.  0→3 are used by NETWRK

X=4 ? A=5 ? B=6 ? P=17

; SAIL system bit definitions

FCS==   000020,,			; full character set mode
FULTWX==000004,,			; no echo

ECHOFF:	001400,,(FULTWX)		; echo off TTYSET command word
TERMID:	'TERMID				; for spies to see where we are
CORBEG==.				; start of initialized core storage
TERSTR:	BLOCK 10.			; console location string
PDL:	BLOCK PDLLEN			; stack
COREND==.-1				; end of initialized storage
;DOVSER CPYHST 1DIGTP NOTTIP

SUBTTL Initialize the world

DOVSER:	JFCL
	RESET
	MOVE ['DOVSER]
	SETNAM
	SETZM CORBEG
	MOVE [CORBEG,,CORBEG+1]
	BLT COREND
	MOVE P,[PDL(-PDLLEN)]
	MOVEI [DEBREAK ? JRST SUICID]
	MOVEM JOBAPR
	CLKINT 5.*60.*60.		; must die if around too long
	OUTSTR [ASCIZ/DOVSER started
/]

; Listen for a connection on our socket

	MOVEI SVRSKT
	MOVEM LSNSKT
	PUSHJ P,LISTEN

; Set up terminal id for interested spies

	MOVEI TERMID
	MOVEM JOBVER

; Log the connection

	OUTSTR [ASCIZ/Connected to /]
	PUSHJ P,MAPHST			; map in host table
	MOVE HOST
	PUSHJ P,HSTNUM			; get HDB
	 JFCL				; sorry about errors
	MOVEI A,(1)			; host name
	HRLI A,440700
	SKIPA X,[440700,,TERSTR]
CPYHST:	 IDPB B,X
	ILDB B,A
	JUMPN B,CPYHST
	HLRZ A,1			; pointer to system name
	MOVE B,(A)			; get system name
	MOVE A,FSOCKT			; and ICP socket
	CAMN B,[ASCII/TIP/]		; on a TIP?
	 TRNE A,177774			; just paranoia; make sure a TIP port
	  JRST NOTTIP
	MOVEI B,"#
	IDPB B,X
	LSH A,-16.
	IDIVI A,8.			; ports are octal
	JUMPE A,1DIGTP
	ADDI A,"0 ? IDPB A,X
1DIGTP:	ADDI B,"0 ? IDPB B,X
NOTTIP:	PUSHJ P,SETANM			; set our job name
	PUSHJ P,UNMHST			; map out the host table
	OUTSTR TERSTR
	OUTSTR [ASCIZ/
/]
;GETCMD

SUBTTL DOVER spooling over a PTY

; Get a PTY, set it up, and log it in

	PTYGET A
	 JRST SUICID
	MOVSI (A)
	IORM ECHOFF
	MOVSI B,(FCS)
	PTSETL A			; set initial bits
	HRROI ECHOFF
	TTYSET				; echo off
	MOVEI B,5			; LOGIN
	PTJOBX A
	 JRST SUICID

; Send command down PTY's throat

	MOVEI B,[ASCIZ/ALIAS T,SYS
DELETE *.PRE
FTP FOO.PRE←/]
	PTWRS7 A			; send prelude
GETCMD:	PUSHJ P,NETICW
	CAIGE 177			; rubout or thing with parity bit?
	 CAIGE <" >			; or a control?
	  JRST GETCM1			; better check this out
	MOVE B,
	PTWR1W A			; ordinary character, send it
	JRST GETCMD
;GETCM1 BROKET BROKT1 BROKT2 LINE1 LINE2 LINE3 GETCM3

GETCM1:	CAIE ↑M				; CR is okay though
	 JRST GETCMD			; ignore other controls
	MOVE B,
	PTWR1W A			; send that
	PUSHJ P,NETICH			; eat the line feed
	PTRD1W A			; and the one from the PTY too!
BROKET:	PTRD1W A			; eat up to the third broket
	CAIE B,"<
	 JRST BROKET
BROKT1:	PTRD1W A
	CAIE B,"<
	 JRST BROKT1
BROKT2:	PTRD1W A
	CAIE B,"<
	 JRST BROKT2
	PTRD1W A
LINE1:	PTRD1W A
	MOVEI (B)
	PUSHJ P,NETOCH
	CAIE B,↑J
	 JRST LINE1
	PUSHJ P,NETSND
LINE2:	PTRD1W A
	CAIE B,↑J
	 JRST LINE2
LINE3:	PTRD1W A
	CAIE B,↑J
	 JRST [	MOVEI (B)
		PUSHJ P,NETOCH
		JRST LINE3]
	MOVEI (B)
	PUSHJ P,NETOCH
	PUSHJ P,NETSND
GETCM3:	PTRD1W A			; eat until see a period
	CAIE B,".
	 JRST GETCM3
	MOVEI B,[ASCIZ/DOVER FOO.PRE
/]
	PTWRS7 A			; send command
;ETCRLF GETPTY GETPT1 SUICID ...LIT SVRRTS ERRTNS ERRHAN ERRINS HSTTAB HSTSIX

ETCRLF:	PTRD1W A
	CAIE B,↑M
	 CAIN B,↑J
	  JRST ETCRLF
GETPTY:	CAIE B,↑J			; end of reply line?
	 JRST [	MOVEI (B)
		PUSHJ P,NETOCH		; send character to user
		PTRD1W A
		JRST GETPTY]
	MOVEI (B)
	PUSHJ P,NETOCH
GETPT1:	PTRD1W A
	CAIE B,".
	 JRST GETPT1
	PUSHJ P,NETSND			; force buffer out
	PUSHJ P,CLOSER
SUICID:	RESET ? EXIT

...LIT:	CONSTANTS

; Wonderful network routines

SVRRTS==-1				; include server routines
ERRTNS==-1				; include error routines
ERRHAN==-1				; include automagic error handling
ERRINS==<JRST SUICID>			; error instruction
HSTTAB==-1				; include host table magic
HSTSIX==-1				; and alias name kludge

.INSRT NETWRK[NET,MRC]

END DOVSER